home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / VideoToolbox 96.06.15 / (Utilities) / TestAttenuator / TestAttenuator.c < prev    next >
C/C++ Source or Header  |  1995-08-13  |  5KB  |  201 lines

  1. /*
  2. TestAttenuator.c
  3. This produced a simple test pattern that allows a quick yes/no evaluation of the
  4. attenuator before shipping. Mainly this is a check to make sure that all the
  5. resistors were soldered correctly.
  6. HISTORY:
  7. 11/89     dgp wrote it
  8. 9/9/90    dgp    make the arrays static.
  9. 10/17/90    dgp    remove unused variable
  10. 2/16/91        dgp    added check for fpu and color quickdraw
  11. 8/24/91    dgp    Made compatible with THINK C 5.0.
  12. 4/27/92    dgp    call SetDepth to set screen to 8 bits.
  13. 8/27/92    dgp    replace SysEnvirons() by Gestalt()
  14. 2/7/93    dgp    updated to use SetPixelsQuickly.
  15. */
  16. #include "VideoToolbox.h"
  17. #include "Luminance.h"
  18.  
  19. #define XMAX         640        /* Maximum horizontal coordinate */ 
  20. #define YMAX         480        /* Maxumum vertical coordinate */
  21.  
  22. void TestAttenuator(void);
  23.  
  24. void main(void)
  25. {
  26.     Require(gestalt8BitQD);
  27.     TestAttenuator();
  28. }
  29.  
  30. void TestAttenuator(void)
  31. {
  32.     register short i,j,k;
  33.     double a,A,AA;
  34.     CWindowPtr window=NULL;
  35.     WindowPtr oldWindow=NULL;
  36.     GDHandle device=NULL,oldGDHandle=NULL;
  37.     static LuminanceRecord LR;
  38.     short n,mode;
  39.     static double fy[YMAX];
  40.     double c;
  41.     static unsigned long row[XMAX];
  42.     short oldScreen;
  43.     char string[100];
  44.     
  45.     /* parameters of the screen calibration */
  46.     
  47.     MaximizeConsoleHeight();
  48.     #if (THINK_C || THINK_CPLUS || SYMANTEC_C)
  49.         console_options.top=YMAX/2-40;
  50.         console_options.nrows=7;
  51.         console_options.txSize=9;
  52.     #elif __MWERKS__
  53.         SIOUXSettings.toppixel=YMAX/2-40;
  54.         SIOUXSettings.rows=7;
  55.         SIOUXSettings.columns=60;
  56.         SIOUXSettings.autocloseonquit=0;
  57.     #endif
  58.     printf("Welcome to TestAttenuator.\n");
  59.     #include "LuminanceRecord1.h"                    // read at compile time
  60.     printf("%s\n",LR.notes);
  61.     oldScreen=LR.screen;
  62.     i=LR.screen;
  63.     do{
  64.         if(GetScreenDevice(1)!=NULL)i=ChooseScreen(i,"Which screen?");
  65.         else i=0;
  66.         device=GetScreenDevice(i);
  67.     }while(device==NULL);
  68.     LR.screen=i;
  69.     sprintf(string,"LuminanceRecord%d.h",LR.screen);
  70.     i=ReadLuminanceRecord(string,&LR,0);        // try to read latest LuminanceRecord
  71.     if(i<1)printf("Warning: couldn't find “%s”. Calibrating screen %d.\n"
  72.         ,string,LR.screen);
  73.     else oldScreen=LR.screen;
  74.  
  75.     /* Find device corresponding to the experimental screen. */
  76.     oldGDHandle = GetGDevice();
  77.     device = GetScreenDevice(LR.screen);
  78.     if(GDClutSize(device)!=256 && NewPaletteManager()){
  79.         mode=HasDepth(device,8,1,1);
  80.         if(mode!=0)SetDepth(device,mode,1,1);        // 8-bit pixelSize, color
  81.     }
  82.     if(GDClutSize(device)!=256){
  83.         PrintfExit("Sorry, I require a screen with 256 colors.\n");
  84.     }
  85.     
  86.     GetPort(&oldWindow);
  87.     window = GDOpenWindow(device);
  88.     SetPort((WindowPtr)window);
  89.     
  90.     for(j=0;j<YMAX/2;j++){
  91.         fy[j]=cos(j*2.0*PI/80.0);
  92.     }
  93.     c=1.0;
  94.     SetLuminances(device,&LR,11,90,LR.LMin,LR.LMin+(LR.LMax-LR.LMin)*c);
  95.     c/=6.0;
  96.     SetLuminances(device,&LR,91,170,LR.LMin,LR.LMin+(LR.LMax-LR.LMin)*c);
  97.     c/=6.0;
  98.     SetLuminances(device,&LR,171,250,LR.LMin,LR.LMin+(LR.LMax-LR.LMin)*c);
  99.     /* Display a swept-contrast sinusoid */
  100.     for(j=0;j<YMAX/2;j++){
  101.         k=floor(0.5+79.0*0.5*c*(1.0 + fy[j]));
  102.         k+=11;
  103.         for(i=0;i<1+XMAX/3;i++)row[i]=k;
  104.         SetPixelsQuickly(0,j,row,1+XMAX/3);
  105.     }
  106.     c *=6.0;
  107.     for(j=0;j<YMAX/2;j++){
  108.         k=floor(0.5+79.0*0.5*c*(1.0 + fy[j]));
  109.         k+=91;
  110.         for(i=0;i<1+XMAX/3;i++)row[i]=k;
  111.         SetPixelsQuickly(XMAX/3,j,row,1+XMAX/3);
  112.     }
  113.     c *=6.0;
  114.     for(j=0;j<YMAX/2;j++){
  115.         k=floor(0.5+79.0*0.5*c*(1.0 + fy[j]));
  116.         k+=171;
  117.         for(i=0;i<1+XMAX/3;i++)row[i]=k;
  118.         SetPixelsQuickly(2*XMAX/3,j,row,1+XMAX/3);
  119.     }
  120.  
  121.     /* compute three clut entries that ought to produce equal luminances */
  122.     AA=LToV(&LR,LR.LMax/4.0);
  123.     printf("%f cd/m^2 equivalent number is %f\n",VToL(&LR,AA),AA);
  124.     i=251;
  125.     A=AA;
  126.     a=A/LR.r;
  127.     if(a>255.) n=255;
  128.     else n=a;
  129.     LR.table[i].rgb.red=n<<8;
  130.     A -= n*LR.r;
  131.     a=A/LR.g;
  132.     if(a>255.) n=255;
  133.     else n=a;
  134.     LR.table[i].rgb.green=n<<8;
  135.     A -= n*LR.g;
  136.     a=A/LR.b;
  137.     if(a>255.) n=255;
  138.     else n=a;
  139.     LR.table[i].rgb.blue=n<<8;
  140.     A -= n*LR.b;
  141.     i++;
  142.     A=AA;
  143.     a=A/LR.g;
  144.     if(a>255.) n=255;
  145.     else n=a;
  146.     LR.table[i].rgb.green=n<<8;
  147.     A -= n*LR.g;
  148.     a=A/LR.b;
  149.     if(a>255.) n=255;
  150.     else n=a;
  151.     LR.table[i].rgb.blue=n<<8;
  152.     A -= n*LR.b;
  153.     a=A/LR.r;
  154.     if(a>255.) n=255;
  155.     else n=a;
  156.     LR.table[i].rgb.red=n<<8;
  157.     A -= n*LR.r;
  158.     i++;
  159.     A=AA;
  160.     a=A/LR.b;
  161.     if(a>255.) n=255;
  162.     else n=a;
  163.     LR.table[i].rgb.blue=n<<8;
  164.     A -= n*LR.b;
  165.     a=A/LR.r;
  166.     if(a>255.) n=255;
  167.     else n=a;
  168.     LR.table[i].rgb.red=n<<8;
  169.     A -= n*LR.r;
  170.     a=A/LR.g;
  171.     if(a>255.) n=255;
  172.     else n=a;
  173.     LR.table[i].rgb.green=n<<8;
  174.     A -= n*LR.g;
  175.     i++;
  176.     for(i=251;i<254;i++) printf("%4d,%4d,%4d = %6.2f == %7.3f cd/m^2\n",
  177.         LR.table[i].rgb.red/256,LR.table[i].rgb.green/256,LR.table[i].rgb.blue/256,
  178.         LToV(&LR,GetLuminance(NULL,&LR,i)), GetLuminance(NULL,&LR,i));
  179.     LoadLuminances(device,&LR,251,253);
  180.     
  181.     /* Display stripes */
  182.     for(i=0;i<XMAX;) {
  183.         for(k=0;k<10;k++)row[i++]=251;
  184.         for(k=0;k<10;k++)row[i++]=252;
  185.         for(k=0;k<10;k++)row[i++]=253;
  186.     }
  187.     for(j=YMAX/2;j<YMAX;j++)SetPixelsQuickly(0,j,row,XMAX);
  188.     
  189.     printf("Hit return to quit.");
  190.     getchar();
  191.     SetPort(oldWindow);
  192.     SetGDevice(oldGDHandle);
  193.     GDDisposeWindow(window);
  194.     RestoreCluts();
  195.     #if (THINK_C || THINK_CPLUS || SYMANTEC_C)
  196.         abort();
  197.     #elif __MWERKS__
  198.         SIOUXSettings.autocloseonquit=1;
  199.     #endif
  200. }
  201.